package com.xj.algorithm.leetcode;

/**
 * 3的幂
 */
public class L326_判断是否是3的幂 {

    /**
     *给定一个整数，写一个函数来判断它是否是 3 的幂次方。
     *
     * 示例 1:
     *
     * 输入: 27
     * 输出: true
     * 示例 2:
     *
     * 输入: 0
     * 输出: false
     * 示例 3:
     *
     * 输入: 9
     * 输出: true
     * 示例 4:
     *
     * 输入: 45
     * 输出: false
     * 进阶：
     * 你能不使用循环或者递归来完成本题吗？
     */
    public static void main(String[] args) {
        System.out.println(isPowerOfThreeOffice(27));
        System.out.println(isPowerOfThreeOffice(0));
        System.out.println(isPowerOfThreeOffice(9));
        System.out.println(isPowerOfThreeOffice(45));
        System.out.println(isPowerOfThreeOffice(4));
    }

    //自己的解法：循环除以3
    public static boolean isPowerOfThree(int n) {
        if(n==0){
            return false;
        }
        while (n%3==0){
            n=n/3;
        }
        if(n==1){
            return true;
        }
        return false;
    }

    //官方解法：进制转换和正则表达式匹配。使用了java内置函数
    public static boolean isPowerOfThreeOffice(int n) {
        return Integer.toString(n, 3).matches("^10*$");
    }

    //精彩解法：log底数转换
    public static boolean isPowerOfThreeGood(int n) {
        return (Math.log10(n) / Math.log10(3)) % 1 == 0;
    }

    //精彩解法2：质数的唯一除数3的19次方为最大值
    public static boolean isPowerOfThreeGood2(int n) {
        return n > 0 && 1162261467 % n == 0;
    }
}
